﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using SCEM.DTO;
using System.Data.Objects;
using System.Data;

namespace SCEM.DataLayer
{
    /// <summary>
    /// DAO de Equipamentos
    /// </summary>
    public class EquipamentoDAO : EntityDAO<Equipamento>, IEquipamentoDAO
    {
        public EquipamentoDAO()
        {
            OrderByProperty = "Nome";
            CanEntityBeDisabled = true;
            EntityEnabledProperty = "Ativo";
        }

        protected override IDTO<Equipamento> ConvertToDTO(Equipamento entity, ObjectContext context)
        {
            EquipamentoDTO dto = new EquipamentoDTO();
            dto.Id = entity.Id.ToString();
            dto.Codigo = entity.Codigo;
            dto.Nome = entity.Nome;
            dto.Descricao = entity.Descricao;
            dto.Fabricante = entity.Fabricante;
            dto.Preco = entity.Preco;
            dto.DataCadastro = entity.DataCadastro;
            dto.DataAtualizacao = entity.DataAtualizacao;
            dto.DataCompra = entity.DataCompra;
            dto.PeriodoGarantiaDias = (int)entity.PeriodoGarantiaDias;
            dto.PeriodoManutencaoPreventivaDias = (int)entity.InformacoesManutencao.PeriodoManutencaoPreventivaDias;
            if (entity.Fornecedor != null && entity.Fornecedor.Id != null)
            {
                dto.FornecedorId = entity.Fornecedor.Id.ToString();
            }
            if (entity.TiposFisioterapia != null && entity.TiposFisioterapia.Id != null)
            {
                dto.TipoFisioterapiaId = entity.TiposFisioterapia.Id.ToString();
            }
            dto.Ativo = entity.Ativo;
            return dto;
        }

        #region Métodos adicionais definidos em IEquipamentoDAO
        
        public List<EquipamentoDTO> ListarEquipamentosAlertaManutencao()
        {
            List<EquipamentoDTO> listaDTO = new List<EquipamentoDTO>();

            using (var context = new SCEMContainer())
            {
                // Listar todos os equipamentos que ainda não tem a próxima manutenção preventiva agendada
                IQueryable<Equipamento> query = context.Equipamentos.Where(e => e.InformacoesManutencao.ProximaManutencaoPreventivaAgendada == null);

                // Selecionar os equipamentos que satisfazem a condição desejada
                foreach (Equipamento item in query.ToList())
                {
                    int diasDesdeAUltimaManutencaoPreventiva = (int)(DateTime.Now - item.InformacoesManutencao.DataUltimaManutencaoPreventiva).TotalDays;

                    if (diasDesdeAUltimaManutencaoPreventiva >= item.InformacoesManutencao.PeriodoManutencaoPreventivaDias - 30)
                        listaDTO.Add((EquipamentoDTO)ConvertToDTO(item, context));
                }

                return listaDTO;
            }
        }

        public List<EquipamentoDTO> ListarEquipamentosManutencaoPreventinaAgendada()
        {
            List<EquipamentoDTO> listaDTO = new List<EquipamentoDTO>();

            using (var context = new SCEMContainer())
            {
                IQueryable<Equipamento> query = context.Equipamentos.Where(e => e.InformacoesManutencao.ProximaManutencaoPreventivaAgendada != null);

                foreach (Equipamento item in query.ToList())
                    listaDTO.Add((EquipamentoDTO)ConvertToDTO(item, context));

                return listaDTO;
            }
        }

        public InformacoesManutencao GetInformacoesManutencao(string equipamentoId)
        {
            Guid entityId;
            try { entityId = new Guid(equipamentoId); }
            catch (Exception) { return null; }

            using (var context = new SCEMContainer())
            {
                EntityKey key = new EntityKey(ContainerName + "." + EntitySetName, "Id", entityId);
                Object entityObject = null;
                if (context.TryGetObjectByKey(key, out entityObject))
                    return ((Equipamento)entityObject).InformacoesManutencao;
                else
                    return null;
            }
        }

        public bool UpdateInformacoesManutencao(string equipamentoId, InformacoesManutencao informacoes)
        {
            if (String.IsNullOrEmpty(equipamentoId) || informacoes == null)
                return false;

            EquipamentoDTO dto = (EquipamentoDTO)Get(equipamentoId);

            using (var context = new SCEMContainer())
            {
                Equipamento equipamento = dto.ConvertToEntity(context);

                try { equipamento.InformacoesManutencao = informacoes; }
                catch (Exception) { return false; }

                if (context.SaveChanges() > 0)
                    return true;
                else
                    return false;
            }
        }

        #endregion

    }
}
